home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Converters / Convert_PICT / Source / CommentedPSCode / Arcs next >
Text File  |  1995-06-12  |  6KB  |  248 lines

  1. %BEGIN Arcs
  2.  
  3. % Copyright (C) 1993 David John Burrowes
  4. % Distributed under terms of GNU General Public License.
  5. % See COPYING.text in Convert PICT's CommentedPSCode for a copy
  6.  
  7. %
  8. %    Note:
  9. %    setupForArcPath, penWidth and penHeight defined in Common file
  10. %
  11.  
  12. %%%%%%%%%%%%%
  13. %    Name:    arcpath
  14. %    Syntax:    top left bottom right start stop arcpath -
  15. %    About:    Given the coordinates for a rectangle, a start and finish angle,
  16. %            build a PICT style wedge/arc.  Note that we rely on the Common
  17. %            setupForArcPath to do the necessary scaling of user space.
  18. %            Note: this uses and sets the 'global' last* variables.
  19. %%%%%%%%%%%%%
  20. /arcpath
  21. {
  22.     /finishAng exch def
  23.     /startAng exch def
  24.     /lastright exch def
  25.     /lastbottom exch def
  26.     /lastleft exch def
  27.     /lasttop exch def
  28.     %
  29.     %    produce an arc-wedge along the specified angles.
  30.     %
  31.     newpath        
  32.         lastright lastleft sub    % compute width & height
  33.         lastbottom lasttop sub
  34.         lastbottom lastleft setupForArcPath
  35.         /radius exch def
  36.         /yoffset exch def
  37.         /xoffset exch def
  38.         xoffset yoffset moveto
  39.         xoffset yoffset radius startAng finishAng arc
  40.     closepath
  41. }
  42. def
  43.  
  44. %%%%%%%%%%%%%
  45. %    Name:    frameArc        [0060]
  46. %    Syntax:    top left bottom right start-angle stop-angle frameArc -
  47. %    About:    Use coords of a rectangle, plus the starting and finishing
  48. %        angle, and frames the outline of a portion of an oval's outline
  49. %        (an arc), using the values of penWidth and penHeight.
  50. %        If the penwidth and height are both 1, then we do a special case
  51. %        framing, because it looks a bit better, and will doubtlessly be
  52. %        used frequently.  Otherwise, we use the setupForArcPath routine
  53. %        to build an oval path which we then frame part of.
  54. %        Note: to get the penwidth and heigh effect, we frame an arc inside
  55. %        the first, and then fill the space between them.
  56. %        Note that the last* values are modified and used here
  57. %%%%%%%%%%%%%
  58. /frameArc
  59. {
  60.     /finishAng exch def
  61.     /startAng exch def
  62.     /lastright exch def
  63.     /lastbottom exch def
  64.     /lastleft exch def
  65.     /lasttop exch def
  66.     
  67.     gsave
  68.         penPattern usePattern
  69.         
  70.         /thewidth lastright lastleft sub def
  71.         /theheight lastbottom lasttop sub def
  72.         %
  73.         %    special case for pens that are 1 by 1 pixel
  74.         %
  75.         penHeight 1 eq
  76.         penWidth 1 eq
  77.         and
  78.         {
  79.             newpath
  80.                 thewidth theheight lastbottom lastleft setupForArcPath
  81.                 startAng finishAng arc
  82.             stroke
  83.         }
  84.         {
  85.             %
  86.             %    More general case for penwidths and heights != 1
  87.             %
  88.             penHeight 0 gt    % We don't want to draw with a 0 sized pen.
  89.             penWidth 0 gt
  90.             and
  91.             {
  92.                 /startmatrix  matrix  currentmatrix def
  93.                 newpath
  94.                     thewidth theheight lastbottom lastleft setupForArcPath
  95.                     startAng finishAng arc
  96.                     %
  97.                     %    Recover from the distortions to user space that
  98.                     %    setupForArcPath did, and calculate the dimensions
  99.                     %    of an inner rectangle bounding the arc's oval.
  100.                     %                    
  101.                     startmatrix setmatrix
  102.  
  103.                     /innerRight lastright penWidth sub 1 add def
  104.                     /innerTop  lasttop penHeight add 1 sub def
  105.                     /innerLeft lastleft penWidth add 1 sub def
  106.                     /innerBottom lastbottom penHeight sub 1 add def
  107.                     /innerWidth innerRight innerLeft sub def
  108.                     /innerHeight innerBottom innerTop sub def
  109.                     
  110.                     innerWidth innerHeight innerBottom innerLeft
  111.                     setupForArcPath
  112.                     finishAng startAng  arcn
  113.                 closepath
  114.                 fill
  115.             }
  116.             if
  117.         }
  118.         ifelse
  119.     grestore
  120. }
  121. def
  122.  
  123. %%%%%%%%%%%%%
  124. %    Name:    paintArc        [0061]
  125. %    Syntax:    t l b r start finish paintArc -
  126. %    About:    pass parameters to arcpath, and fill the resulting arc.
  127. %%%%%%%%%%%%%
  128. /paintArc
  129. {
  130.     gsave
  131.         penPattern usePattern
  132.         arcpath
  133.         fill
  134.     grestore
  135. }
  136. def
  137.  
  138. %%%%%%%%%%%%%
  139. %    Name:    eraseArc        [0062]
  140. %    Syntax:    t l b r start finish eraseArc -
  141. %    About:    Pass params to arcpath and fill the wedge with background pat
  142. %%%%%%%%%%%%%
  143. /eraseArc
  144. {
  145.     gsave
  146.         backPattern usePattern
  147.         arcpath
  148.         fill
  149.     grestore
  150. }
  151. def
  152.  
  153. %%%%%%%%%%%%%
  154. %    Name:    invertArc        [0063]
  155. %    Syntax:    t l b r start finish invertArc -
  156. %    About:    Calls arcpath, only to get last* values stored, 'cause we
  157. %            don't even try to invert the arc.
  158. %%%%%%%%%%%%%
  159. /invertArc
  160. {
  161.     gsave
  162.         arcpath
  163.     grestore
  164. }
  165. def
  166.  
  167. %%%%%%%%%%%%%
  168. %    Name:    fillArc        [0064]
  169. %    Syntax:    t l b r start finish fillArc -
  170. %    About:    Passes params to arcpath, and fills the resulting wedge.
  171. %%%%%%%%%%%%%
  172. /fillArc
  173. {
  174.     gsave
  175.         fillPattern usePattern
  176.         arcpath
  177.         fill
  178.     grestore
  179. }
  180. def
  181.  
  182. %%%%%%%%%%%%%
  183. %    Name:    frameSameArc    [0068]
  184. %    Syntax:    start finish frameSameArc -
  185. %    About:    Use last* values and params to frame an arc
  186. %%%%%%%%%%%%%
  187. /frameSameArc
  188.     /endAng exch def
  189.     /startAng exch def
  190.     lasttop lastleft lastbottom lastright startAng endAng frameArc
  191. }
  192. def
  193.  
  194. %%%%%%%%%%%%%
  195. %    Name:    paintSameArc    [0069]
  196. %    Syntax:    start finish paintSameArc -
  197. %    About:    Use last* values and params to paint an arc
  198. %%%%%%%%%%%%%
  199. /paintSameArc
  200.     /endAng exch def
  201.     /startAng exch def
  202.     lasttop lastleft lastbottom lastright startAng endAng paintArc
  203. }
  204. def
  205.  
  206. %%%%%%%%%%%%%
  207. %    Name:    eraseSameArc    [006A]
  208. %    Syntax:    start finish eraseSameArc -
  209. %    About:    Use last* values and params to erase an arc
  210. %%%%%%%%%%%%%
  211. /eraseSameArc
  212.     /endAng exch def
  213.     /startAng exch def
  214.     lasttop lastleft lastbottom lastright startAng endAng eraseArc
  215. }
  216. def
  217.  
  218. %%%%%%%%%%%%%
  219. %    Name:    invertSameArc    [006B]
  220. %    Syntax:    start finish invertSameArc -
  221. %    About:    Use last* values and params to (try to) invert an arc
  222. %%%%%%%%%%%%%
  223. /invertSameArc
  224.     /endAng exch def
  225.     /startAng exch def
  226.     lasttop lastleft lastbottom lastright startAng endAng invertArc
  227. }
  228. def
  229.  
  230. %%%%%%%%%%%%%
  231. %    Name:    fillSameArc        [006C]
  232. %    Syntax:    start finish fillSameArc -
  233. %    About:    Use last* values and params to (try to) fill an arc
  234. %%%%%%%%%%%%%
  235. /fillSameArc
  236.     /endAng exch def
  237.     /startAng exch def
  238.     lasttop lastleft lastbottom lastright startAng endAng fillArc
  239. }
  240. def
  241.  
  242. %END Arcs
  243.